package com.liyuci.core.service;

import java.util.List;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort.Direction;

/**
 * 基本的通用的Service方法.
 * @author liyuci
 * @date Oct 18, 2017 11:44:53 PM
 */
public interface IService<T>
{
	/**
	 * 根据id软删除对象.
	 * @author liyuci
	 * @date Oct 19, 2017 12:00:45 AM
	 * @param id	对象id
	 */
	public void delete(String id);
	
	/**
	 * 软删除对象.
	 * @author liyuci
	 * @date 2017-10-19 00:19:30
	 * @param t		被删除的对象
	 */
	public void delete(T t);
	
	/**
	 * 根据id硬删除对象.
	 * @author liyuci
	 * @date 2017-10-20 12:37:14
	 * @param id	对象id
	 */
	public void deleteForHard(String id);
	
	/**
	 * 硬删除对象.
	 * @author liyuci
	 * @date 2017-10-20 12:37:26
	 * @param t		被删除的对象
	 */
	public void deleteForHard(T t);
	
	/**
	 * 根据id查找对象.
	 * @author liyuci
	 * @date Oct 19, 2017 12:04:16 AM
	 * @param id	对象id
	 * @return		查找的对象信息，如果不存在就返回空
	 */
	public T getOne(String id);
	
	/**
	 * 分页信息列表.
	 * @author liyuci
	 * @date 2017-10-20 13:54:41
	 * @param pageable	分页信息
	 * @return			分页的信息列表
	 */
	public Page<T> list(Pageable pageable);
	
	//public Page<T> list(int page, int limit, );
	
	/**
	 * 更新或保存对象.
	 * @author liyuci
	 * @date Oct 18, 2017 11:57:10 PM
	 * @param t		需要保存的对象
	 * @return		返回保存成功对象
	 */
	public T saveOrUpdate(T t);
	
	//分页、查询、排序信息
	
	/**
	 * 查询所有的信息
	 * @author liyuci
	 * @date 2018-02-05 16:08:50
	 * @param sortFieldName		排序字段名称
	 * @param sortDirection		排序，Direction.DESC、Direction.ASC
	 * @return
	 */
	public List<T> listAll(String sortFieldName, Direction sortDirection);
	
	public List<T> listAllOrderBySortOrderAsc();
	public List<T> listAllOrderBySortOrderDesc();
	public List<T> listAllOrderByCreateDateAsc();
	public List<T> listAllOrderByCreateDateDesc();
	
	/**
	 * 根据字段名和字段值查询所有信息
	 * @author liyuci
	 * @date 2018-02-05 16:40:57
	 * @param fieldName
	 * @param fieldValue
	 * @return
	 */
	public List<T> listAllByFieldName(String fieldName, String fieldValue);
	
	/**
	 * 根据字段名和字段值查询所有信息
	 * @author liyuci
	 * @date 2018-02-05 16:42:22
	 * @param fieldName
	 * @param fieldValue
	 * @param sortFieldName
	 * @param sortDirection
	 * @return
	 */
	public List<T> listAllByFieldName(String fieldName, String fieldValue, String sortFieldName, Direction sortDirection);
	
	public List<T> listAllByFieldNameOrderBySortOrderAsc(String fieldName, String fieldValue);
	
	public List<T> listAllByFieldNameOrderBySortOrderDesc(String fieldName, String fieldValue);
	
	public List<T> listAllByFieldNameOrderByCreateDateAsc(String fieldName, String fieldValue);
	
	public List<T> listAllByFieldNameOrderByCreateDateDesc(String fieldName, String fieldValue);
}
